/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.pb.sistcomp.controller;

import br.pb.sistcomp.dao.LanceDao;
import br.pb.sistcomp.dao.LanceDaoImpl;
import br.pb.sistcomp.dao.LeilaoDao;
import br.pb.sistcomp.dao.LeilaoDaoImpl;
import br.pb.sistcomp.dao.PessoaDao;
import br.pb.sistcomp.dao.PessoaDaoImpl;
import br.pb.sistcomp.entity.Lance;
import br.pb.sistcomp.entity.Leilao;
import br.pb.sistcomp.entity.Pessoa;
import br.pb.sistcomp.exception.*;
import br.pb.sistcomp.util.MessagesUtil;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

/**
 * Class that represents an entity in the system
 *
 * @author George Alcantara, george.lima@dce.ufpb.br
 * @version 1.0
 *
 * Copyright (C) 2011 SistComp.
 */

@ManagedBean
@SessionScoped

public class LanceController {
    private Lance lance;
    private LanceDao lanceDAO;
    private List<Lance> lances;
    private DataModel modelLances;
    private List<SelectItem> selectPessoas;
    private List<SelectItem> selectLeiloes;
    private Pessoa pessoa;
    private PessoaDao pessoaDao;
    private Leilao leilao;
    private LeilaoDao leilaoDao;
    private int leilaoSelecionado;
    private int pessoaSelecionada;
    

    public LanceController(){
        lanceDAO = new LanceDaoImpl();
        lances = new ArrayList();
        lance = new Lance();
        selectPessoas = new ArrayList<SelectItem>();
        pessoa = new Pessoa();
        pessoaDao = new PessoaDaoImpl();
        leilao = new Leilao();
        leilaoDao = new LeilaoDaoImpl();
        selectLeiloes = new ArrayList<SelectItem>();
    }
    
    public DataModel carregarLances(){
        leilaoSelecionado = 0;
        pessoaSelecionada = 0;
        modelLances = new ListDataModel(lanceDAO.listarTodos());
        return modelLances;
    }
    
    public String salvarLance(){
        try{
            Pessoa pessoaSelec = pessoaDao.procurarPessoa(pessoaSelecionada);
            lance.setPessoa(pessoaSelec);
            Leilao leilaoSelec = leilaoDao.procurar(leilaoSelecionado);
            lance.setLeilao(leilaoSelec);
            if(lance.getValor()<=leilaoSelec.getLance_ini()){
                MessagesUtil.addErroMsg("Voçê precisa informar um valor igual ou superior ao valor inicial do lance : " + leilaoSelec.getLance_ini());
                throw new ErroAoSalvarException("Valor incorreto");
            }
            lance.setDataLance(new Date());
            lance.setHoraLance(new Date());
            lanceDAO.salvarLance(lance);
            MessagesUtil.addInfoMsg("Seu lançe foi dado com sucesso !");
            lance = new Lance();
            modelLances = carregarLances();
            return "/restrito/lance/listarLancesRestrito";
        }catch (ErroAoSalvarException e){    
            MessagesUtil.addErroMsg("Erro ao finalizar o lance");
            e.printStackTrace();
            return "/restrito/lance/cadastrarLanceRestrito";
        }
    }

    public String removerLance(){
        try{
            lance = (Lance) modelLances.getRowData();
            modelLances = carregarLances();
            lanceDAO.removerLance(lance);
            MessagesUtil.addInfoMsg("Seu lançe foi removido com sucesso !");
        }catch(Exception e){
            MessagesUtil.addErroMsg("Erro ao remover o lance");
            e.printStackTrace();
        }finally{ 
            return "/restrito/lance/listarLancesRestrito";
        }
    }
    
    public String editarLance(){
        lance = (Lance) modelLances.getRowData();
        return "/restrito/lance/cadastrarLanceRestrito";        
    }
    
    public String listarLances(){
        modelLances = carregarLances();
        return "/lance/listarLances";
    }
    
    public String listarLancesRestrito(){
        modelLances = carregarLances();
        return "listarLancesRestrito";
    }
    
     public List<SelectItem> getSelectPessoa() {
        
        ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
        List<Pessoa> listaDePessoas = pessoaDao.listarTodos();
        for (Pessoa p : listaDePessoas) {
            SelectItem item = new SelectItem(p.getId(), p.getNome());
            lista.add(item);
        }
        return lista;
    }
     
    public List<SelectItem> getSelectLeilao() {
        ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
        List<Leilao> listaDeLeiloes = leilaoDao.listarTodos();
        for (Leilao l : listaDeLeiloes) {
            SelectItem item = new SelectItem(l.getId(), l.getDescricao());
            lista.add(item);
        }
        return lista;
    }

    public Lance getLance() {
        return lance;
    }

    public void setLance(Lance lance) {
        this.lance = lance;
    }

    public int getLeilaoSelecionado() {
        return leilaoSelecionado;
    }

    public void setLeilaoSelecionado(int leilaoSelecionado) {
        this.leilaoSelecionado = leilaoSelecionado;
    }

    public int getPessoaSelecionada() {
        return pessoaSelecionada;
    }

    public void setPessoaSelecionada(int pessoaSelecionada) {
        this.pessoaSelecionada = pessoaSelecionada;
    }

    public Leilao getLeilao() {
        return leilao;
    }

    public void setLeilao(Leilao leilao) {
        this.leilao = leilao;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public LeilaoDao getLeilaoDao() {
        return leilaoDao;
    }

    public void setLeilaoDao(LeilaoDao leilaoDao) {
        this.leilaoDao = leilaoDao;
    }

    public DataModel getModelLances() {
        return modelLances;
    }

    public void setModelLances(DataModel modelLances) {
        this.modelLances = modelLances;
    }

    public PessoaDao getPessoaDao() {
        return pessoaDao;
    }

    public void setPessoaDao(PessoaDao pessoaDao) {
        this.pessoaDao = pessoaDao;
    }

    public List<SelectItem> getSelectLeiloes() {
        return selectLeiloes;
    }

    public void setSelectLeiloes(List<SelectItem> selectLeiloes) {
        this.selectLeiloes = selectLeiloes;
    }

    public List<SelectItem> getSelectPessoas() {
        return selectPessoas;
    }

    public void setSelectPessoas(List<SelectItem> selectPessoas) {
        this.selectPessoas = selectPessoas;
    }
    
    
    
    public String preencheComboBox(){
        setSelectPessoas(selectPessoas);
        setLeilaoSelecionado(leilaoSelecionado);
        return "/restrito/lance/cadastrarLanceRestrito";
    }
   
    
}
